###################################################################################################################
########################################  STAND - ALONE FIREWALL  #################################################
########################################  BEN LEARN, JORDAN LEWIS  ################################################
########################################  FEB 08, 2011  ###########################################################
###################################################################################################################

###################################################################################################################
########################################  USER - DEFINED VARIABLES  ###############################################
###################################################################################################################
fw_ext_addr="192.168.0.14"
fw_DMZ_addr="192.168.1.1"
client_addr="192.168.1.5"
allowedTcpPorts="80,3333"
allowedUdpPorts="39,41"
ICMPnum=(8)
ipSubnet="192.168.1.0/24"
ext_int="eth10"
int_int="eth9"



###################################################################################################################
#######################################  IMPLEMENTATION SECTION  ##################################################
#######################################  DO NOT CHANGE ANYTHING BELOW THIS LINE  ##################################
###################################################################################################################



# Flush Netfilter firewall rules 
iptables -F
iptables -X
iptables -t nat -F
echo "Resetting firewall rules"

echo 1 > /proc/sys/net/ipv4/ip_forward
# SSH: need to make sure that the domain for the target machine (firewall) is not cached in the clients host file.
#      To remove entries from ssh host file type ssh-keygen -R [ip]

# Forwarding rules
# postrouting == out
iptables -A POSTROUTING -t nat -o ${ext_int} -j SNAT --to-source ${fw_ext_addr}

# prerouting == in
iptables -A PREROUTING -t nat -i ${ext_int} -d ${fw_ext_addr} -j DNAT --to-destination ${client_addr}

#related forward rules
iptables -A FORWARD -i ${int_int} -o ${ext_int} -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ${ext_int} -o ${int_int} -m state --state ESTABLISHED -j ACCEPT

# Define user chains
iptables -N tcpfwd
iptables -N udpfwd

# Allow DNS to work
iptables -A udpfwd -p udp --dport 53 --sport 1024:65535 -j ACCEPT # Allow DNS out
iptables -A udpfwd -p udp --sport 53 --dport 1024:65535 -j ACCEPT # Allow DNS in

###################################################################################################################
# Rule 1: Default policy == DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Rule 2: Allow user-defined ports
iptables -A tcpfwd -p tcp -m multiport --dport ${allowedTcpPorts} -j ACCEPT # -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A udpfwd -p udp -m multiport --dport ${allowedUdpPorts} -j ACCEPT # -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Rule 3: Allow user-defined ICMP type numbers
for i in "${ICMPnum[@]}"
do
	iptables -A FORWARD -p icmp --icmp-type $i -m state --state NEW,ESTABLISHED -j ACCEPT
done

# Rule 4: Deny packets to FIREWALL machine
iptables -A tcpfwd -p tcp -d ${fw_ext_addr} -j DROP
iptables -A udpfwd -p udp -d ${fw_ext_addr} -j DROP

# Rule 5: Deny packets from within internal IP range
iptables -A tcpfwd -p tcp -s ${ipSubnet} -j DROP
iptables -A udpfwd -p udp -s ${ipSubnet} -j DROP

# Rule 6: Block SYN packets to high ports
iptables -A tcpfwd -p tcp --dport 1024:65535 --syn -j DROP

# Rule 7: Allow established TCP traffic
iptables -A tcpfwd -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# Rule 8: Block TCP packets with SYN & FIN bits set
iptables -A tcpfwd -p tcp --tcp-flags SYN,ACK,FIN,RST SYN,FIN -j DROP

# Rule 9: Block Telnet
iptables -A tcpfwd -p tcp --dport 23 -j DROP

# Rule 10: DROP packets to ports 32768:32775 (only incoming packets, outgoing should be allowed)
iptables -A tcpfwd -p tcp --dport 32768:32775 -j DROP
iptables -A udpfwd -p udp --dport 32768:32775 -j DROP

# Rule 11: DROP packets to ports 137:139 (only incoming packets, outgoing should be allowed)
iptables -A tcpfwd -p tcp --dport 137:139 -j DROP
iptables -A udpfwd -p udp --dport 137:139 -j DROP

# Rule 12: DROP packets to TCP 111 (only incoming packets, outgoing should be allowed)
iptables -A tcpfwd -p tcp --dport 111 -j DROP

# Rule 13: DROP packets to TCP 515 (only incoming packets, outgoing should be allowed)
iptables -A tcpfwd -p tcp --dport 515 -j DROP

# Rule 14: Mangle FTP control packets for minimum delay (Why --sport not --dport? Wouldnt incoming packets be destined for these services???)
iptables -A PREROUTING -t mangle -p tcp --sport ftp -j TOS --set-tos Minimize-Delay

# Rule 15: Mangle SSH packets for minimum delay
iptables -A PREROUTING -t mangle -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
iptables -A tcpfwd -p tcp --dport ssh -j ACCEPT

# Rule 16: Mangle FTP data for maximium throughput
iptables -A PREROUTING -t mangle -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput
###################################################################################################################


# Link user-defined chains to forward chain
iptables -A FORWARD -p tcp -j tcpfwd
iptables -A FORWARD -p udp -j udpfwd
